home *** CD-ROM | disk | FTP | other *** search
/ The Very Best of Atari Inside / The Very Best of Atari Inside 1.iso / mint / mntlib43 / mntlib / lockf.c < prev    next >
C/C++ Source or Header  |  1993-10-11  |  1KB  |  95 lines

  1. /*
  2.  * lockf(3) and flock(2) emulation for MiNT by Dave Gymer
  3.  * Placed in the public domain; do with me as you will!
  4.  */
  5.  
  6. #include <compiler.h>
  7. #include "lib.h"
  8. #include <errno.h>
  9. #include <fcntl.h>
  10. #include <unistd.h>
  11. #include <mintbind.h>
  12. #ifdef __TURBOC__
  13. #include <sys\file.h>
  14. #else
  15. #include <sys/file.h>
  16. #endif
  17.  
  18. static int do_lock __PROTO((int fd, int cmd, long size, int whence));
  19.  
  20. static int
  21. do_lock(fd, cmd, size, whence)
  22.     int fd;
  23.     int cmd;
  24.     long size;
  25.     int whence;
  26. {
  27.     struct flock lock;
  28.     int fcmd;
  29.     long r;
  30.     extern int __mint;
  31.  
  32.     if (!__mint) {
  33.         errno = -EINVAL;
  34.         return -1;
  35.     }
  36.     lock.l_whence = whence;
  37.     lock.l_start = 0;
  38.     lock.l_len = size;
  39.     switch (cmd) {
  40.         case F_ULOCK:
  41.             lock.l_type = F_UNLCK;
  42.             fcmd = F_SETLK;
  43.             break;
  44.         case F_TEST:
  45.             lock.l_type = F_WRLCK;
  46.             fcmd = F_GETLK;
  47.             break;
  48.         case F_TLOCK:
  49.             lock.l_type = F_WRLCK;
  50.             fcmd = F_SETLK;
  51.             break;
  52.         case F_LOCK:
  53.             lock.l_type = F_WRLCK;
  54.             if (__mint < 95)
  55.                 fcmd = F_SETLK;
  56.             else
  57.                 fcmd = F_SETLKW;
  58.             break;
  59.         default:
  60.             errno = -EINVAL;
  61.             return -1;
  62.     }
  63.     if ((r = Fcntl(fd, &lock, fcmd)) < 0) {
  64.         errno = (int) -r;
  65.         return -1;
  66.     }
  67.     return 0;
  68. }
  69.  
  70. int
  71. lockf(fd, cmd, size)
  72.     int fd;
  73.     int cmd;
  74.     long size;
  75. {
  76.     return do_lock(fd, cmd, size, 1);
  77. }
  78.  
  79. int
  80. flock(fd, op)
  81.     int fd, op;
  82. {
  83.     int cmd;
  84.  
  85.     if (op & (LOCK_SH | LOCK_EX))
  86.         cmd = (op & LOCK_NB) ? F_TLOCK : F_LOCK;
  87.     else if (op & LOCK_UN)
  88.         cmd = F_ULOCK;
  89.     else {
  90.         errno = -EINVAL;
  91.         return -1;
  92.     }
  93.     return do_lock(fd, cmd, 0L, 0);
  94. }
  95.